Skip to content
c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr int N = 100005;
constexpr int M = 200005;
struct edge{int u,v;}e[M];
int n, m, q;
int head[N], to[M << 1], nxt[M << 1], tot = 1;
int dfn[N], low[N], timer;
int stk[N], top;
int del[N], ebcc_cnt;
int dep[N], fa[N], up[N];
void add(int u, int v) {
    nxt[++tot] = head[u];
    head[u] = tot;
    to[tot] = v;
}
void tarjan(int u, int e) {
    dfn[u] = low[u] = ++timer;
    stk[++top] = u;
    for (int i = head[u]; i; i = nxt[i]) {
        if ((i ^ 1) == e) continue;
        int v = to[i];
        if (!dfn[v]) {
            tarjan(v, i);
            low[u] = std::min(low[u], low[v]);
        } else if (dfn[v] < dfn[u]) {
            low[u] = std::min(low[u], dfn[v]);
        }
    }

    if (dfn[u] == low[u]) {
        ++ebcc_cnt;
        do {
            del[stk[top]] = ebcc_cnt;
        } while (stk[top--] != u);
    }
}

void init() {
    tot = 1, ebcc_cnt = 0;
    timer = 0;
    for (int i = 0; i <= n; i++) head[i] = dfn[i] = low[i] = del[i] = 0;
}
void dfs(int u, int f) {
    up[u] = f;
    fa[u] = u;
    dep[u]=dep[f]+1;
    for (int i = head[u]; i; i = nxt[i]) {
        int v = to[i];
        if (v != f) {
            dfs(v, u);
        }
    }
}
int find(int x) { return x == fa[x] ? x : (fa[x] = find(fa[x])); }
bool merge(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) return false;
    if(dep[x]<dep[y])fa[y] = x;
    else fa[x]=y;
    return true;
}
void link(int x,int y){
    x=find(del[x]);y=find(del[y]);
    while(x!=y){
        if(dep[x]>=dep[y]){
            merge(x,up[x]);
            x=find(x);
        }else{
            merge(y,up[y]);
            y=find(y);
        }
        ebcc_cnt--;
    }
}
int tc=0;
void fc() {
    init();
    for (int i = 0; i < m; i++) {
        int u, v;
        std::cin >> u >> v;
        e[i].u=u;e[i].v=v;
        add(u, v);
        add(v, u);
    }

    tarjan(1, 0);

    tot = 0;
    for (int i = 1; i <= ebcc_cnt; i++) head[i] = 0;
    for(int i=0;i<m;i++){
        int u=del[e[i].u],v=del[e[i].v];
        if(u!=v)add(u,v),add(v,u);
    }
    dfs(1, 0);

    std::cout << "Case " << ++tc << ":\n";
    std::cin >> q;
    for (int i = 1; i <= q; i++) {
        int u, v;
        std::cin >> u >> v;
        link(u,v);
        std::cout<<ebcc_cnt-1<<"\n";
    }
    std::cout<<"\n";
    std::cin >> n >> m;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    std::cin >> n >> m;
    while (n && m) fc();
    return 0;
}